package com.aps.server.mapper;

import com.aps.server.entity.ApsOrder;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

import java.time.LocalDate;
import java.util.List;

/**
 * APS订单 Mapper 接口
 * 继承 MyBatis Plus 的 BaseMapper，提供基础的 CRUD 操作
 */
@Mapper
public interface ApsOrderMapper extends BaseMapper<ApsOrder> {

    /**
     * 根据租户ID查询订单列表
     * 
     * @param tenantId 租户ID
     * @return 订单列表
     */
    @Select("SELECT * FROM aps_order WHERE tenant_id = #{tenantId} ORDER BY create_time DESC")
    List<ApsOrder> selectByTenantId(@Param("tenantId") String tenantId);
    
    /**
     * 根据租户ID分页查询订单列表
     * 
     * @param page 分页对象
     * @param tenantId 租户ID
     * @return 分页订单列表
     */
    @Select("SELECT * FROM aps_order WHERE tenant_id = #{tenantId} ORDER BY create_time DESC")
    IPage<ApsOrder> selectPageByTenantId(Page<ApsOrder> page, @Param("tenantId") String tenantId);
    
    /**
     * 根据原始订单编码查询订单
     * 
     * @param orderId 原始订单编码
     * @param tenantId 租户ID
     * @return 订单信息
     */
    @Select("SELECT * FROM aps_order WHERE order_id = #{orderId} AND tenant_id = #{tenantId}")
    ApsOrder selectByOrderId(@Param("orderId") String orderId, @Param("tenantId") String tenantId);
    
    /**
     * 根据APS订单编码查询订单
     * 
     * @param apsOrderId APS订单编码
     * @param tenantId 租户ID
     * @return 订单信息
     */
    @Select("SELECT * FROM aps_order WHERE aps_order_id = #{apsOrderId} AND tenant_id = #{tenantId}")
    ApsOrder selectByApsOrderId(@Param("apsOrderId") String apsOrderId, @Param("tenantId") String tenantId);
    
    /**
     * 根据产品编码查询订单列表
     * 
     * @param productId 产品编码
     * @param tenantId 租户ID
     * @return 订单列表
     */
    @Select("SELECT * FROM aps_order WHERE product_id = #{productId} AND tenant_id = #{tenantId} ORDER BY create_time DESC")
    List<ApsOrder> selectByProductId(@Param("productId") String productId, @Param("tenantId") String tenantId);
    
    /**
     * 根据交付日期范围查询订单列表
     * 
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @param tenantId 租户ID
     * @return 订单列表
     */
    @Select("SELECT * FROM aps_order WHERE delivery_date BETWEEN #{startDate} AND #{endDate} AND tenant_id = #{tenantId} ORDER BY delivery_date ASC")
    List<ApsOrder> selectByDeliveryDateRange(@Param("startDate") LocalDate startDate, 
                                           @Param("endDate") LocalDate endDate, 
                                           @Param("tenantId") String tenantId);
    
    /**
     * 根据优先级查询订单列表
     * 
     * @param priority 优先级
     * @param tenantId 租户ID
     * @return 订单列表
     */
    @Select("SELECT * FROM aps_order WHERE priority = #{priority} AND tenant_id = #{tenantId} ORDER BY create_time DESC")
    List<ApsOrder> selectByPriority(@Param("priority") String priority, @Param("tenantId") String tenantId);
    
    /**
     * 统计租户下的订单数量
     * 
     * @param tenantId 租户ID
     * @return 订单数量
     */
    @Select("SELECT COUNT(*) FROM aps_order WHERE tenant_id = #{tenantId}")
    Long countByTenantId(@Param("tenantId") String tenantId);
    
    /**
     * 统计租户下指定优先级的订单数量
     * 
     * @param priority 优先级
     * @param tenantId 租户ID
     * @return 订单数量
     */
    @Select("SELECT COUNT(*) FROM aps_order WHERE priority = #{priority} AND tenant_id = #{tenantId}")
    Long countByPriorityAndTenantId(@Param("priority") String priority, @Param("tenantId") String tenantId);
    
    /**
     * 查询即将到期的订单（交付日期在指定天数内）
     * 
     * @param days 天数
     * @param tenantId 租户ID
     * @return 即将到期的订单列表
     */
    @Select("SELECT * FROM aps_order WHERE delivery_date <= DATE_ADD(CURDATE(), INTERVAL #{days} DAY) AND tenant_id = #{tenantId} ORDER BY delivery_date ASC")
    List<ApsOrder> selectUpcomingOrders(@Param("days") int days, @Param("tenantId") String tenantId);
}
